package top.zlcode.file.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

/**
 * 服务器信息配置类
 */
@Configuration
@Slf4j
public class ServerInfoConfig {

    /**
     * 定义“本机非回环IPv4地址”的Spring Bean
     * 作用域：默认单例（服务器IP启动后一般不变，单例更高效）
     */
    @Bean(name = "localServerIp") // Bean名称，注入时可指定
    public String localServerIp() {
        try {
            // 遍历所有网卡，获取第一个非回环IPv4地址
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            while (interfaces.hasMoreElements()) {
                NetworkInterface ni = interfaces.nextElement();
                Enumeration<InetAddress> addresses = ni.getInetAddresses();
                while (addresses.hasMoreElements()) {
                    InetAddress addr = addresses.nextElement();
                    // 排除回环地址（127.0.0.1）和IPv6地址（含":"）
                    if (!addr.isLoopbackAddress() && !addr.getHostAddress().contains(":")) {
                        String ip = addr.getHostAddress();
                        log.info("成功获取本机服务器IP地址：{}", ip);
                        return ip;
                    }
                }
            }
            // 兜底：若未找到，返回本地回环地址（127.0.0.1）
            String fallbackIp = InetAddress.getLocalHost().getHostAddress();
            log.warn("未找到非回环IP，返回兜底地址：{}", fallbackIp);
            return fallbackIp;
        } catch (Exception e) {
            log.error("获取本机IP地址失败", e);
            return "unknown"; // 异常时返回默认值，避免Bean创建失败
        }
    }
}